package demo.day11

// Kotlin语言中使用in和out
fun main() {
    // 逆变 in T setClass 只能修改 更改 不能给外界读取
    val p1 = SetClass<String>()
    p1.set1("Kiki")
    p1.set3("Qiqi")
    // 协变 out T getClass 只能读取 不能修改 更改
    val p2 = GetClass("Jiji")
    p2.get1()
    p2.get2()
}

// in T out T 声明处指定关系 声明处泛型 这个是Java没有的功能
// 只能修改泛型的值 不能获取 读取泛型的值
// 小结：当我们 对这个整个类里面的泛型 只能修改 不能让外界读取时
// 可以声明 in T 逆变
class SetClass<in T>() {
    fun set1(item: T) {
        println("set1 要设置的item是$item")
    }

    fun set2(item: T) {
        println("set2 要设置的item是$item")
    }

    fun set3(item: T) {
        println("set3 要设置的item是$item")
    }
    // 不能给外界获取
    /**
     * Type parameter T is declared as 'in'
     * but occurs in 'out' position in type T?
     */
//    fun get1():T?{
//        return null
//    }
}

/**
 * 整个GetClass里面的所有成员 泛型相关 不能修改 只能获取值
 */
class GetClass<out T>(_item: T) {
    val item = _item
    fun get1(): T? {
        return item
    }

    fun get2(): T? {
        return item
    }

    fun get3(): T? {
        return item
    }
}